package com.bangcommunity.bbframe.media;

import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_imgproc;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameConverter;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author tanghc
 * @date 18/6/26
 */
public class JavaCvTest2 {

    public static void main(String[] args) throws Exception {

        // randomGrabberFFmpegImage("e:/ffmpeg/aa.mp4", "./target", "screenshot", 5);

//        randomGrabberFFmpegImage("/opt/data/v1.mp4", "/opt/data", "screenshot", 1);
//        randomGrabberFFmpegImage("/opt/data/v1.mp4", "/opt/data", "screenshot");
        addVideo();
    }

    // 获取摄像头视频流并添加水印
    public static void addVideo() throws Exception, InterruptedException {
        // 转换器，用于Frame/Mat/IplImage相互转换
        OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();

        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("/opt/data/v1.mp4");
        grabber.start(); // 开始获取摄像头数据
        CanvasFrame cFrame = new CanvasFrame("做好自己！--eguid！", CanvasFrame.getDefaultGamma() / grabber.getGamma());
        cFrame.setAlwaysOnTop(true);
        cFrame.setVisible(true);
        // 水印文字位置
        opencv_core.Point point = new opencv_core.Point(10, 50);
        // 颜色，使用黄色
        opencv_core.Scalar scalar = new opencv_core.Scalar(0, 255, 255, 0);
        Frame frame = null;
        int index = 0;
        double alpha = 0.5;// 图像透明权重值,0-1之间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        while (cFrame.isShowing()) {
            if ((frame = grabber.grabFrame()) != null) {
                // 取一帧视频（图像），并转换为Mat
                opencv_core.Mat mat = converter.convertToMat(grabber.grabFrame());

                // 加文字水印，opencv_imgproc.putText（图片，水印文字，文字位置，字体，字体大小，字体颜色，字体粗度，平滑字体，是否翻转文字）
//                opencv_imgproc.putText(mat, "eguid!", point, opencv_imgproc.CV_FONT_VECTOR0, 1.2, scalar, 1, 20, false);
                // 定义感兴趣区域(位置，logo图像大小)
//                opencv_core.Mat ROI = mat.apply(new opencv_core.Rect(400, 350, logo.cols(), logo.rows()));
                opencv_imgproc.putText(mat, sdf.format(new Date()), point, opencv_imgproc.CV_FONT_ITALIC, 0.8, scalar,
                        2, 20, false);
//                opencv_core.addWeighted(ROI, alpha, logo, 1.0 - alpha, 0.0, ROI);
                // 把logo图像复制到感兴趣区域
//               logo.copyTo(ROI, mask);
                // 显示图像到窗口
                cFrame.showImage(converter.convert(mat));
//                if (index == 0) {
//                    // 保存第一帧图片到本地
//                    opencv_imgcodecs.imwrite("eguid.jpg", mat);
//                }
                // 释放Mat资源
//                ROI.release();
//                ROI.close();
                mat.release();
                mat.close();
                Thread.sleep(40);
                index++;
            }

            index++;
//
//
//
//
//            if (!canvas.isDisplayable()) {// 窗口是否关闭
//                grabber.stop();// 停止抓取
//                System.exit(2);// 退出
//            }
//            frame = grabber.grab();
//            // 取一帧视频（图像），并转换为Mat
//            opencv_core.Mat mat = converter.convertToMat(frame);
//
//            // 加文字水印，opencv_imgproc.putText（图片，水印文字，文字位置，字体，字体大小，字体颜色，字体粗度，文字反锯齿，是否翻转文字）
//            opencv_imgproc.putText(mat, "eguid!", point2, opencv_imgproc.CV_FONT_VECTOR0, 2.2, scalar2, 1, 0, false);
//            // 翻转字体，文字平滑处理（即反锯齿）
//            opencv_imgproc.putText(mat, "eguid!", point3, opencv_imgproc.CV_FONT_VECTOR0, 2.2, scalar2, 1, 20, true);
//
//            opencv_imgproc.putText(mat, sdf.format(new Date()), point1, opencv_imgproc.CV_FONT_ITALIC, 0.8, scalar1,
//                    2, 20, false);
//            // 在窗口显示处理后的图像，Frame frame=converter.convert(mat);
//            canvas.showImage(converter.convert(mat));

            //canvas.showImage(grabber.grab());// 获取摄像头图像并放到窗口上显示， 这里的Frame
            // frame=grabber.grab() ;
            // frame是一帧视频图像
//            Thread.sleep(50);// 50毫秒刷新一次图像
        }
        // 关闭窗口
        cFrame.dispose();
        // 停止抓取器
        grabber.stop();
        // 释放资源
        scalar.close();
        point.close();
    }
}
